﻿using Common.Enums;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Wallpaper.Models.Entities;

namespace Wallpaper.Data.Configurations
{
    public class WallpaperConfiguration : IEntityTypeConfiguration<Wallpapers>
    {

        public void Configure(EntityTypeBuilder<Wallpapers> builder)
        {
                // 设置表名
                builder.ToTable("wallpapers");

                // 配置主键
                builder.HasKey(w => w.Id);
                builder.Property(w => w.Id)
                    .HasMaxLength(36)
                    .IsRequired()
                    .HasComment("壁纸主键ID");

                // 壁纸标题配置
                builder.Property(w => w.Title)
                    .HasMaxLength(50)
                    .IsRequired()
                    .HasComment("壁纸标题");

                // 文件URL配置
                builder.Property(w => w.FileUrl)
                    .HasMaxLength(200)
                    .IsRequired()
                    .HasComment("壁纸文件URL（原图地址）");

                // 缩略图URL配置
                builder.Property(w => w.ThumbnailUrl)
                    .HasMaxLength(100)
                    .IsRequired(false)
                    .HasComment("缩略图URL（用于列表展示）");

                // 上传人ID配置
                builder.Property(w => w.UploaderId)
                    .HasMaxLength(36)
                    .IsRequired()
                    .HasComment("上传人ID（关联用户或管理员）");

                // 分类ID配置
                builder.Property(w => w.CategoryId)
                    .HasMaxLength(36)
                    .IsRequired()
                    .HasComment("分类ID（关联分类表）");

            // 上传人类型配置
                 builder.Property(w => w.UploaderType)
                    .HasConversion<byte>()  // ← 改为 byte，因为数据库是 tinyint
                    .IsRequired()
                    .HasDefaultValue(UploaderType.NormalUser) // 使用枚举值
                    .HasComment("上传人类型：0-用户，1-管理员");

               // 宽度配置
                 builder.Property(w => w.Width)
                    .IsRequired()
                    .HasComment("壁纸宽度（像素）");

                // 高度配置
                builder.Property(w => w.Height)
                    .IsRequired()
                    .HasComment("壁纸高度（像素）");

            // 审核状态配置
            // 审核状态配置
                builder.Property(w => w.ReviewStatus)
                    .HasConversion<byte>()  // ← 改为 byte，因为数据库是 tinyint
                    .IsRequired()
                    .HasDefaultValue(WallpaperReviewStatus.Pending) // 使用枚举值
                    .HasComment("审核状态：0-待审核，1-审核通过，2-审核不通过");

            // 审核人ID配置
            builder.Property(w => w.ReviewerId)
                    .HasMaxLength(50)
                    .IsRequired(false) // 允许为空（未审核时）
                    .HasComment("审核人ID");

                // 审核意见配置
                builder.Property(w => w.ReviewComment)
                    .HasMaxLength(500)
                    .IsRequired(false) // 允许为空（审核通过时）
                    .HasComment("审核意见/理由（审核不通过时显示给用户）");

                // 审核时间配置
                builder.Property(w => w.ReviewedAt)
                    .IsRequired(false) // 允许为空（未审核时）
                    .HasComment("审核时间");

                // 创建时间配置
                builder.Property(w => w.CreatedAt)
                    .IsRequired()
                    .HasDefaultValueSql("CURRENT_TIMESTAMP")
                    .HasComment("创建时间（上传时间）");

                // 更新时间配置
                builder.Property(w => w.UpdatedAt)
                    .IsRequired(false)
                    .HasComment("最后更新时间");

                // 软删除配置
                builder.Property(w => w.IsDeleted)
                    .IsRequired()
                    .HasDefaultValue(false)
                    .HasComment("软删除标志：true-已删除,false-正常");



            // 配置分类关系
            builder.HasOne(w => w.Category)
                .WithMany(c => c.Wallpapers)
                .HasForeignKey(w => w.CategoryId)
                .OnDelete(DeleteBehavior.Restrict); // 限制删除如果分类下有壁纸，不允许删除这个分类

            // 创建索引
            builder.HasIndex(w => w.CategoryId)
                    .HasDatabaseName("idx_wallpapers_categoryid");


                builder.HasIndex(w => w.UploaderId)
                    .HasDatabaseName("idx_wallpapers_uploaderid");


                builder.HasIndex(w => w.ReviewStatus)
                    .HasDatabaseName("idx_wallpapers_reviewstatus");


                builder.HasIndex(w => w.CreatedAt)
                    .HasDatabaseName("idx_wallpapers_createdat");


                // 复合索引：用于前台展示已审核的壁纸
                builder.HasIndex(w => new { w.ReviewStatus, w.CreatedAt })
                    .HasDatabaseName("idx_wallpapers_status_created");

                // 复合索引：用于用户查询自己的壁纸
                builder.HasIndex(w => new { w.UploaderId, w.CreatedAt })
                    .HasDatabaseName("idx_wallpapers_uploader_created");

                // 添加全局查询过滤器（自动过滤已删除的壁纸）
                builder.HasQueryFilter(w => w.IsDeleted == false);
        }
    }
    
}
